#include <iostream>
#include <fstream>

using namespace std;

#ifdef DEBUG_MODE
const unsigned int MASCHERA = 3;

// debug che permete di vedere le carte dell'avversario
#define ALTERNATIVE

#define  DBG(A, B) {if((A) & MASCHERA) { B; } }

#else
#define DBG(A, B)

#endif

#define D1(a) DBG(1, a)
#define D2(a) DBG(2, a)




/* Struttura dati */

/** Nome del file che contiene tutti i nomi delle immagini delle carte
 */
const char NOME_FILE[] = "nomi_carte.txt";

/** Lunghezza del nome memorizzato nel NOME_FILE, ovvero del nome delle immagini.
 */ 
const int MAX_LUN_RIGA1 = 7;

/** Lunghezza del nome del file immagine completo, contiene il percorso relativo.
 */ 
const int MAX_LUN_RIGA2 = 16;

/** Numero di carte che compone il mazzo.
 */
const int NUM_CARTE = 40;

/** Numero di carte che compondono la mano di gioco.
 */
const int NUM_MANO = 3;

/** Vettore che contiene i pesi delle rispettive carte: i punteggi.
 */
const int PESI[10]={11,0,10,0,0,0,0,2,3,4};

/** Vettore che contiene le precedenze per valore. A parità di seme chi vince
 *  su le altre.
 */
const int PREC[10]={0,9,1,8,7,6,5,4,3,2};


/** Struttura che rappresenta la mia carta.
 *  val    --> numero generato casualmente, compreso tra 0 e 39; 
				   valore numerico identificativo per numero e segno. 
 *  nome   --> nome del file della carta comprendente il percorso assoputo.
 *  selez  --> Valore booleano che identifica la carta giocata.
 *  esiste --> Valore booleano per indicare l'esistenza la carta : 
	       		campo che mi serve per le ultime tre mano, che sono un eccezione 
	       		rispetto alle altre. 
 */
struct carta_t{
	int val;
	char nome[MAX_LUN_RIGA2];
	bool selez;
	bool esiste;
	};

/** Tipo enum che indica quale giocatore sta giocando.
 */
enum gioca_t {giocatore, computer};


/** Tipo enum che mi dice chi gioca per primo, e quindi chi pesca.
 */ 
enum turno_t {primo, secondo}; 


/** Tipo enum che definisce la priorità di una carta. 
 *  priorità massima se è briscola, priorità media alla carta giocata per prima,
 *  priorità bassa per la seconda carta giocata.
 */
enum prior_carta_t {brisc, first, second};


/** Struttura che rappresenta entrambi i giocatori.
 *  mano      --> vettore che rappresenta la mano del giocatore, di tipo carta.
 *  punteggio --> valore intero che incrementa in base alle mani che vince 
						sommando i valori delle carte prese.
 */
struct giocatore_t{
	carta_t mano[NUM_MANO];
	int punteggio;
	};


/** Struttura che rappresenta il mio gioco.
 *  mazzo --> vettore contenente le mie carte.
 *  idx   --> indice che scorre il mazzo. 
 	      (segnala la fine del gioco e la carta da pescare a fine turno).

 *  player1 e player2
	  --> rappresentano i due giocatori.
 */
struct partita_t{
	carta_t mazzo[NUM_CARTE];
	int idx;
	giocatore_t player1;
	giocatore_t player2;
	int id_fine;
};
